웹을 파헤치는 이유와 방법
오늘날의 성능 문제
현대의 웹 페이지나 웹 애플리케이션을 전송하는 일은 결코 간단한 문제가 아니다. 페이지 내 수백 개의 객체, 수천 개의 도메인, 변동이 심한 네트워크, 광범위한 디바이스 기능이 존재하는 환경에서 일관되고 빠른 웹 경험을 만들어 내는 것은 쉬운 일이 아니다.
웹 페이지를 가져와 렌더링하는 데 필요한 여러 단계뿐 아니라 단계마다 내재 된 문제를 이해하는 것은 웹 사이트와 상호 작용하는 사용자를 불편하지 않게 하는 데 가장 중요한 부분이다.
웹 페이지의 요청 구조
브라우저는 웹 페이지를 요청할 때 화면에 페이지를 표시하는 데 필요한 모든 정보를 가져오기 위해 반복적인 절차를 거친다.
- 가져올 URL을 대기열에 넣는다.
- URL 내의 호스트이름의 IP 주소를 조회한다.
- 호스트로 TCP 연결을 연다.
- 요청이 HTTPS라면, TLS 핸드셰이크를 완료한다.
- 기준 페이지 URL에 대한 요청을 전송한다.
다음은 응답을 수신하여 페이지를 렌더링하는 절차를 보여준다.
- 응답을 수신한다.
- 기준 HTML이라면, HTML을 파싱하여 우선순위에 따라 페이지의 개체들의 반입을 시작한다.
- 페이지의 필수 개체를 수신했다면, 화면 렌더링을 시작한다.
- 추가 개체를 수신하면, 끝날 때까지 파싱과 렌더링을 계속한다.
앞의 절차는 페이지를 클릭할 때마다 반복되어야 한다. 이 반복적인 절차는 네트워크와 디바이스 자원에 부담을 준다. 이 중 어느 단계든 최적화하거나 제거하는 일이 웹 성능 튜닝에 핵심적인 부분이다.
중요 성능
- 지연시간: IP 패킷이 한 지점에서 다른 지점으로 이동하는데 걸리는 시간을 말한다. 이와 관련된 것으로 RTT(Round Trip Time)이 있다. RTT는 지연 시간의 2배를 의미한다. 지연 시간은 성능의 주요 병목점이며, 서버까지 많은 왕복이 이루어지는 HTTP와 같은 프로토콜에서 특히 더 그렇다.
- 대역폭: 두 지점 사이의 연결은 포화 상태가 되기 직전까지의 데이터양만 동시에 처리할 수 있다. 웹 페이지의 데이터 양과 연결의 용량에 따라 대역폭이 성능의 병목점이 될 수 있다.
- DNS 조회: 클라이언트가 웹 페이지를 가져올 수 있으려면 인터넷의 전화번호부인 DNS를 사용해 호스트이름을 IP 주소로 변환해야 한다. 이 절차는 가져온 HTML 페이지에 있는 모든 고유한 호스트이름에 대해 이루어져야 하며, 호스트이름당 한 번만 하면 된다.
- 연결 시간: 연결을 수립하려면 클라이언트와 서버 사이에 3방향 핸드셰이크라는 메시지 주고받기가 필요하다. 이 핸드셰이크 시간은 보통 클라이언트와 서버 사이의 지연 시간과 관련이 있다. 핸드셰이크를 위해서는 클라이언트가 서버로 SYN 패킷을 보내고, 서버는 그 SYN에 대한 서버의 ACK와 SYN 패킷을 클라이언트로 전송하며, 클라이언트는 다시 SYN에 대한 ACK을 서버로 전송한다.
- TLS 협상 시간: 클라이언트가 HTTPS 연결을 하고 있다면, SSL의 후속 프로토콜인 TLS(Transport Layer Security) 협상이 필요하다. 이 때문에 서버와 클라이언트의 처리 시간에 왕복 시간이 더 추가된다.
이 시점에 클라이언트는 아직 요청을 보내지도 않았으며 DNS 왕복 시간과 TCP와 TLS를 위한 추가 시간이 이미 소요되었다. 다음으로 네트워크보다는 서버 자체의 내용이나 성능에 더 의존적인 지표를 살펴보자.
- TTFB: 클라이언트가 웹 페이지 탐색을 시작한 때무터 기준 페이지 응답의 첫 번째 바이트를 수신한 때까지 걸린 시간을 측정한 것이다. 이것은 서버의 처리 시간뿐만 아니라 앞서 소개한 여러 지표를 합한 값이다. 한 페이지에 여러 개체가 있는 경우, TTFB는 브라우저가 요청을 전송한 시점부터 첫 번째 바이트가 되돌아온 시점까지의 시간을 측정한다.
- 콘텐츠 다운로드 시간: 이것은 요청한 객체에 대한 TTLB(Time To Last Byte)이다.
- 렌더링 시작 시간: 클라이언트가 사용자를 위해 얼마나 빨리 화면에 무언가를 표시할 수 있는가? 이것은 사용자가 얼마나 오랫동안 빈 페이지를 바라보았는가를 측정한 것이다.
- 문서 완성 시간(또는 페이지 로딩 시간): 클라이언트가 페이지 표시를 완료한 시간이다.
HTTP/1의 문제점
HTTP/1.0과 HTTP/1.1의 문제